#include "U2EAGLView.h"

#include "U2GLESPreRequest.h"
#include "U2Root.h"
#include "U2RenderWindow.h"
#include "U2GLESRenderSystem.h"
#include "U2Viewport.h"
#include "U2Camera.h"
#import <QuartzCore/QuartzCore.h>


U2EG_NAMESPACE_USING


@implementation EAGLView

@synthesize mWindowName;

- (NSString *)description
{
    return [NSString stringWithFormat:@"EAGLView frame dimensions x: %.0f y: %.0f w: %.0f h: %.0f", 
            [self frame].origin.x,
            [self frame].origin.y,
            [self frame].size.width,
            [self frame].size.height];
}

+ (Class)layerClass
{
    return [CAEAGLLayer class];
}

- (void)layoutSubviews
{
    // Change the viewport orientation based upon the current device orientation.
    // Note: This only operates on the main viewport, usually the main view.

    [[UIDevice currentDevice] beginGeneratingDeviceOrientationNotifications];
    UIDeviceOrientation deviceOrientation = [UIDevice currentDevice].orientation;
    [[UIDevice currentDevice] endGeneratingDeviceOrientationNotifications];

    // Return if the orientation is not a valid interface orientation(face up, face down)
    if(!UIDeviceOrientationIsValidInterfaceOrientation(deviceOrientation))
        return;

    // Get the window using the name that we saved
    U2RenderWindow *window = static_cast<U2RenderWindow *>(U2Root::getSingleton().getRenderSystem()->getRenderTarget(mWindowName));

    if(window != NULL)
    {
        // Get the window size and initialize temp variables
        unsigned int w = 0, h = 0;
        unsigned int width = self.bounds.size.width;
        unsigned int height = self.bounds.size.height;

        U2Viewport *viewPort = window->getViewport(0);

        if (UIDeviceOrientationIsLandscape(deviceOrientation))
        {
            w = std::max(width, height);
            h = std::min(width, height);
        }
        else
        {
            h = std::max(width, height);
            w = std::min(width, height);
        }

        width = w;
        height = h;

        // Resize the window
        window->resize(width, height);

        // After rotation the aspect ratio of the viewport has changed, update that as well.
        viewPort->getCamera()->setAspectRatio((u2real) width / (u2real) height);
    }
}

@end
